import store from '@/store';
import Httpaxios from 'axios'
import router from '../router/index.js'
import {getNewToken} from '../api/index.js'
import Notify from '../ui/index.js';
import {
  getToken,removeToken
} from './token.js'
const axios = Httpaxios.create({
  // baseURL: 'http://geek.itheima.net',
  baseURL: 'http://toutiao.itheima.net',
  // baseURL:'https://www.fastmock.site/mock/cae70b06c191553a3337db29fee79057/api',
  timeout: 5000
})

// 添加请求拦截器
// ? 可选链操作符 如果前面对象里没有length,整个表达式原地返回undefined
// 我的理解: getToken() && getToken().length > 0  有东西,并且东西的长度 > 0
axios.interceptors.request.use(function(config) {
  if (getToken('hmtt')?.length > 0 && config.headers.Authorization == undefined) {
    config.headers.Authorization = `Bearer ${getToken('hmtt')}`
  }
  return config;
}, function(error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function(response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  return response;
}, async function(error) {
  console.log(error,'error')
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  if (error.response.status === 401) {
    // 方法1 : 用户有感刷新token(重新获取),强制跳转重新登录
    // router.replace('/login')
    removeToken() // 把过期的错误的 token 清理掉
    router.replace(`/login?path=${router.currentRoute.fullPath}`) // currentRoute里包含上一个路由的路由信息,这里实现的是登录未遂地址的保存
    // 方法2 : 使用 refresh_token 换回新的 token 再继续使用,用户无感知
    // let res = await getNewToken()
    // 方法2.1 存储续签最新的 token
    // setToken(res.data.data.token)
     // 方法2.2 把新获取回来的 token 放在错误信息对象的config配置对象的请求头内,方便发送未完成的请求时使用
    // error.config.headers.Authorization = 'Bearea ' + getToken()
     // 方法2.3 继续完成上一次的请求,上一次因为权限而失败的请求在,错误对象里的config配置对象里面,只需要放入axios里面即可再次发送一次请求,
     // 但是发送请求前记得把最新得到的token放入错误信息配置对象error的请求头里,得到的结果我们要return回原本逻辑页面调用的地方,本质还是return回一个promise对象,
   // 如果不return,就会跑到最下面返回一个错误对象
    // return axios(error.config)
    Notify({
      type: 'warning',
      message: '用户未认证'
    });
  }else if(error.request.status === 500 && error.config.method === 'put' && error.config.url === '/v1_0/authorizations'){
    // 先清理全部的token
    localStorage.clear()
     // 如果用户token已过期并且refresh_token也过期的情况下,就需要重新登录了
        Notify({
          type: 'warning',
          message: '用户未认证'
        });
        return router.replace('/login')
  }
  return Promise.reject(error)
});

export default axios
